<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        //    mao
        function b(a) {
            var p = new Promise(function (resolve, reject) {
                if (a >= 5) {
                    console.log('a大于等于5')
                    resolve('大于5条件里的回调')
                } else {
                    console.log('a小于等于5')
                    reject('小于5条件里的回调')
                }

            });
            return p;
        }

        b(4)
            .then(function (data) {
                // data就是resolve里的东西
                console.log(data)
                //后面可以用传过来的数据做些其他操作
                //......
            })
            .catch(function (data) {
                // data就是reject里的东西
                console.log(data)
                //后面可以用传过来的数据做些其他操作
                //......
            })

        // var waitSecond = new Promise(function (resolve, reject) {
        //     console.log('pro')
        //     setTimeout(function () {
        //         console.log('settime1')
        //         resolve()
        //     }, 0);
        // });
        // var secPro = setTimeout(function () {
        //     console.log('settime2')
        //     var a = new Promise(function (resolve, reject) {
        //         console.log('pro2')
        //     })
        // }, 0)
        // waitSecond
        //     .then(function () {
        //         console.log("Hello"); // 1秒后输出"Hello"
        //         // return waitSecond;
        //     })
        //     .then(function () {
        //         console.log("Hi"); // 2秒后输出"Hi"
        //     });
        // setTimeout(function () {

        //     console.log('定时器开始啦')

        // });


        // new Promise(function (resolve) {

        //     console.log('马上执行for循环啦');

        //     for (var i = 0; i < 10000; i++) {

        //         i == 99 && resolve();

        //     }

        // }).then(function () {

        //     console.log('执行then函数啦')

        // });
        // console.log('代码执行结束');


        // // 宏任务和微任务
        // setTimeout(function () {
        //     console.log('setTimeout');

        // })
        // new Promise(function (resolve) {
        //     console.log('promise');

        // }).then(function () {
        //     console.log('then');

        // })


        // console.log('console');


        // console.log('1');


        // setTimeout(function () {

        //     console.log('2');

        //     // process.nextTick(function () {

        //     //     console.log('3');

        //     // })

        //     new Promise(function (resolve) {

        //         console.log('4');

        //         resolve();

        //     }).then(function () {

        //         console.log('5')

        //     })

        // })

        // // Window.process.nextTick(function () {

        // //     console.log('6');

        // // })

        // new Promise(function (resolve) {

        //     console.log('7');

        //     resolve();

        // }).then(function () {

        //     console.log('8')

        // })


        // setTimeout(function () {

        //     console.log('9');

        //     // process.nextTick(function () {

        //     //     console.log('10');

        //     // })

        //     new Promise(function (resolve) {

        //         console.log('11');

        //         resolve();

        //     }).then(function () {

        //         console.log('12')

        //     })

        // })


        //  

        // const p1 = new Promise(function (resolve, reject) {
        //     setTimeout(() => reject(new Error('fail')), 3000)
        // })

        // const p2 = new Promise(function (resolve, reject) {
        //     setTimeout(() => resolve(p1), 1000)
        // })

        // p2
        //     .then(result => console.log(result))
        //     .catch(error => console.log(error))



        // const p1 = new Promise((resolve, reject) => {
        //     resolve('hello');
        // })
        //     .then(result => result)
        //     .catch(e => e);

        // const p2 = new Promise((resolve, reject) => {
        //     throw new Error('报错了');
        // })
        //     .then(result => result)
        //     .catch(e => e);

        // Promise.all([p1, p2])
        //     .then(result => console.log(result))
        //     .catch(e => console.log(e));
        // ["hello", Error: 报错了]

        // const p1 = new Promise((resolve, reject) => {
        //     resolve('hello');
        // })
        //     .then(result => result);

        // const p2 = new Promise((resolve, reject) => {
        //     // throw new Error('报错了');
        //     resolve('p2');
        // })
        //     .then(result => result);

        // Promise.all([p1, p2])
        // // 必须参数里的promise 全部返回resolved  这里才会执行.then()
        //     .then(result => console.log(result))
        //     .catch(e => console.log(e));
        //     // Error: 报错了



// generator  与 Promise

        function getFoo() {
            return new Promise(function (resolve, reject) {
                resolve('foo');
            });
        }

        const g = function* () {
            try {
                const foo = yield getFoo();
                console.log(foo);
            } catch (e) {
                console.log(e);
            }
        };

        function run(generator) {
            const it = generator();

            function go(result) {
                if (result.done) return result.value;

                return result.value.then(function (value) {
                    return go(it.next(value));
                }, function (error) {
                    return go(it.throw(error));
                });
            }

            go(it.next());
        }

        run(g);

    </script>
</body>

</html>